Tablas para presentacion en SITREP

Jorge Mario Estrada Alvarez MSc. PhD(c)

Creación de tablas para reportes finales

  • Pueden proceder de un dataframe creado mediante agrupaciones: group_by(), count(), summarize() y que estan listas para pasarse a un reporte

  • Pueden ser creadas directamente desde la base nominal o individual con resultados estadisticos basicos de resumen (medidas de tendencia central, porcentajes, pruebas estadisticas)

  • Diversos formatos para exportar: MS word, Ms power point, pdf, Html, Ms Excel.

  • Al ser un producto final requiere de afinamiento en codigo para lograr la apariencia requerida para un reporte final: titulo, encabezados, centrado, ajuste de tamaño, etc.

Librerias para tablas

{Flextable}

{gtsummary}

Flextable

Pagina de ayuda para Flextable
  • Principal función de la libreria: Esta libreria permite funcionarse con Tidyverse y se utiliza con el operador %>%
flextable(
  data,                     # tabla de datos a convertir                         
  col_keys = names(data),   # nombre por defectos de las columnas
  cwidth = 0.75,            # ancho de columnas
  cheight = 0.25,           # alto de columnas
  defaults = list(),
  theme_fun = theme_booktabs
)

Todo dataframe debe pasar obligatoriamente por esta funcion para covertirla en objeto flextable que permitira trabjar otras funciones de la libreria Flextable

Flextable

Cambio de encabezados

set_header_labels(x,            # objeto flextable 
name_colum = "Etiqueta",        # columna de la tabla = nombre como debe aparecer
name_colum = "Etiqueta"         # columna de la tabla = nombre como debe aparecer
)

Alineación de contenido

align(
  x,              # objeto flextable
  i = NULL,       # posicion de la columna
  j = NULL,       # posicion de la columna
  align = "left", # right, left, center
  part = c("body", "header", "footer", "all") # parte de la tabla
)

Flextable

formato de texto

bold(x,      # objeto flextable
i = NULL,     # posicion de la fila
j = NULL,     # posicion de la columna
bold = TRUE,  # negrilla
part = "body") # parte de la tabla a cambiar

color de texto

color(x,        # objeto flextable
i = NULL,       # numero de fila
j = NULL,       # numero de columna
color,          # color = "red" o codificacion hexagesimal
part = "body")  # parte de la tabla a cambiar

Flextable

Relleno de celda

bg(x,     # objeto flextable
i = NULL, # numero de fila
j = NULL, # numero de columna
bg,       # color o paleta de colorew
part = "body" # parte de la tabla
) 
  • Relleno de celda basado en un patrón
# construccion de paleta
escala_color <- col_numeric(
    palette = c("wheat", "red"),
    domain = c(0, 7)
)

Flextable

titulo de la tabla

set_caption(x,      # objeto flextable
  caption = NULL   # titulo de la tabla
)

Otras funciones utiles para explorar:

  • autofit()

  • save_as_docx()

  • theme_apa(), theme_booktabs(), theme_vanilla(), theme_zebra()

Libreria gtsummary

gtsummary

A diferencia de flextable esta libreria actua sobre el data frame donde la información esta caso a caso (nominal), mientras que la anterior trabaja sobre dataframe consolidados o agrupados, casi ya para un producto final.

# A tibble: 6 × 4
  trt      age marker stage
  <chr>  <dbl>  <dbl> <fct>
1 Drug A    23  0.16  T1   
2 Drug B     9  1.11  T2   
3 Drug A    31  0.277 T1   
4 Drug A    NA  2.07  T3   
5 Drug A    51  2.77  T4   
6 Drug B    39  0.613 T4   

Fuente: https://www.danieldsjoberg.com/gtsummary/articles/tbl_summary.html

gtsummary

Principal función para producir tablas univariadas consolidadas (varias variables en una sola tabla)

tbl_summary(
  data,
  by = NULL,
  label = NULL,
  statistic = NULL,
  digits = NULL,
  type = NULL,
  value = NULL,
  missing = NULL,
  missing_text = NULL,
  sort = NULL,
  percent = NULL,
)

Para fortuna del usuario, se puede utilizar con el operador %>% lo que la hace compatible con el Tidyverse

Miremos instrucciones para construir una sintaxis de una tabla de gtsummary:

Instrucciones para completar una sintaxis para una tabla en gtsummary

Fuente: https://www.danieldsjoberg.com/gtsummary/articles/tbl_summary.html

  • Seleccionamos las variables que queremos en la tabla y creamos la tabla por defecto:
brote %>% 
select(gender, age, outcome) %>% 
tbl_summary(
)
Characteristic N = 1361
gender
    f 39 (29%)
    m 95 (71%)
    Unknown 2
age 34 (20, 44)
outcome
    Death 32 (41%)
    Recover 47 (59%)
    Unknown 57
1 n (%); Median (IQR)

¿Qué podemos identificar que pueda requerir cambio ?

  • Cambiemos label de las variables (nombre de la variable):
brote %>% 
select(gender, age, outcome) %>% 
tbl_summary(label = gender ~ "Sexo")
Characteristic N = 1361
Sexo
    f 39 (29%)
    m 95 (71%)
    Unknown 2
age 34 (20, 44)
outcome
    Death 32 (41%)
    Recover 47 (59%)
    Unknown 57
1 n (%); Median (IQR)

Para varias variables al tiempo:

brote %>% 
select(gender, age, outcome) %>% 
tbl_summary(label = list(gender ~ "Sexo",
                         age ~ "Edad",
                         outcome ~ "Estado final"))
Characteristic N = 1361
Sexo
    f 39 (29%)
    m 95 (71%)
    Unknown 2
Edad 34 (20, 44)
Estado final
    Death 32 (41%)
    Recover 47 (59%)
    Unknown 57
1 n (%); Median (IQR)

¿ Qué mas podrias ajustar en la tabla ?

Ajustemos esos datos faltantes (missing)

brote %>% 
select(gender, age, outcome) %>% 
tbl_summary(label = list(gender ~ "Sexo",
                         age ~ "Edad",
                         outcome ~ "Estado final"),
            missing = "no")
Characteristic N = 1361
Sexo
    f 39 (29%)
    m 95 (71%)
Edad 34 (20, 44)
Estado final
    Death 32 (41%)
    Recover 47 (59%)
1 n (%); Median (IQR)

¿ Podriamos hacer que la tabla sea comparativa?

Muertos vs Vivos

Tablas comparativas

brote %>% 
select(gender, age, outcome) %>% 
tbl_summary(label = list(gender ~ "Sexo",
                         age ~ "Edad",
                         outcome ~ "Estado final"),
            missing = "no",
            by = outcome)
Characteristic Death, N = 321 Recover, N = 471
Sexo
    f 9 (29%) 12 (26%)
    m 22 (71%) 34 (74%)
Edad 36 (27, 49) 26 (12, 40)
1 n (%); Median (IQR)

¿ Sera que hay diferencias estadisticamente significativas ?

Tablas comparativas: adicionando resultados de pruebas estadisticas

brote %>% 
select(gender, age, outcome) %>% 
tbl_summary(label = list(gender ~ "Sexo",
                         age ~ "Edad",
                         outcome ~ "Estado final"),
            missing = "no",
            by = outcome) %>% 
add_p()
Characteristic Death, N = 321 Recover, N = 471 p-value2
Sexo 0.8
    f 9 (29%) 12 (26%)
    m 22 (71%) 34 (74%)
Edad 36 (27, 49) 26 (12, 40) 0.019
1 n (%); Median (IQR)
2 Pearson's Chi-squared test; Wilcoxon rank sum test

Nota: No olvidar que se debe evaluar la selección de una u otra prueba estadística

brote %>% 
select(gender, age, outcome) %>% 
tbl_summary(label = list(gender ~ "Sexo",
                         age ~ "Edad",
                         outcome ~ "Estado final"),
            missing = "no",
            by = outcome) %>% 
add_p(test = list(age ~ "t.test", gender ~ "fisher.test"))
Characteristic Death, N = 321 Recover, N = 471 p-value2
Sexo 0.8
    f 9 (29%) 12 (26%)
    m 22 (71%) 34 (74%)
Edad 36 (27, 49) 26 (12, 40) 0.013
1 n (%); Median (IQR)
2 Fisher's exact test; Welch Two Sample t-test

Finalmente….. Exportamos a word

  1. Convertimos nuestra tabla gtsummary a flextable
  2. Exportamos a Ms word
brote %>% 
select(gender, age, outcome) %>% 
tbl_summary(label = list(gender ~ "Sexo",
                         age ~ "Edad",
                         outcome ~ "Estado final"),
            missing = "no",
            by = outcome) %>% 
add_p(test = list(age ~ "t.test", gender ~ "fisher.test")) %>% 
  as_flex_table() %>% 
  save_as_docx(path = "documento.docx")

Gracias